package ctd.dome.sync;

/**
 * 1.这里的对象锁只有一个,就是child对象的锁,当执行child.doSomething时，该线程获得child对象的锁，
 * 在doSomething方法内执行doAnotherThing时再次请求child对象的锁，因为synchronized是重入锁，
 * 所以可以得到该锁，继续在doAnotherThing里执行父类的doSomething方法时第三次请求child对象的锁，
 * 同理可得到，如果不是重入锁的话，那这后面这两次请求锁将会被一直阻塞，从而导致死锁。
 *
 * 2.所以在Java内部，同一线程在调用自己类中其他synchronized方法/块或调用父类的synchronized方法/块
 * 都不会阻碍该线程的执行，就是说同一线程对同一个对象锁是可重入的，而且同一个线程可以获取同一把锁多次，
 * 也就是可以多次重入。因为java线程是基于“每线程（per-thread）”，而不是基于“每调用（per-invocation）”
 * 的（java中线程获得对象锁的操作是以每线程为粒度的，per-invocation互斥体获得对象锁的操作是以每调用作为粒度的）
 * Created by houxr on 2017/4/21 16:09.
 */
public class Son extends Father {

    public synchronized void doSomething() {
        System.out.println("child.doSomething...");
        //调用自己的其他方法synchronized方法
        doAnotherThing();
    }

    public synchronized void doAnotherThing() {
        //调用父类的synchronized方法
        super.doSomething();
        System.out.println("child.doAnotherThing...");
    }

    public synchronized static void main(String[] args) {
        Son child = new Son();
        child.doSomething();
    }
}

class Father {
    public synchronized void doSomething() {
        System.out.println("father.doSomething...");
    }

}